//
//  Man.m
//  07-内存管理
//
//  Created by dllo on 16/7/12.
//  Copyright © 2016年 dllo. All rights reserved.
//

#import "Man.h"

@implementation Man
- (void)dealloc
{
    // 释放所有的属性(copy ,retain)修饰下
    [_mId release];
    [_name release];
    [_sexual release];
    [_mDescription release];
    [_gayBoy release];
    NSLog(@"对象被释放");
    [super dealloc];
}
// 协议方法的实现,是签订者的实现(@implementation)中
- (void)sayHello {
    NSLog(@"Hello,I'm Gay");
}
- (id)copyWithZone:(nullable NSZone *)zone {
    // 开辟新的空间,创建一个新的对象
    Man *man = [[Man allocWithZone:zone]  init];
    // 浅拷贝只创建了新的对象,但是所有的属性还指向原来的属性
//    man.name = self.name;
//    man.sexual = self.sexual;
    // 深拷贝,不止创建新的对象,所有的属性也对应的拷贝一份新的
    man.name = [self.name copy];
    man.sexual = [self.sexual copy];
    return man;
}
// 赋值用,在这个方法中,编写找不到key值得处理措施
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
    
    if ([key isEqualToString:@"id"]) {
        //_mId = value; // 凡是和setter 赋值相关的用self.属性,原因是提供value 这个值的字典
        //如果没不见了...
        self.mId = value;
    }
    if ([key isEqualToString:@"description"]) {
//        _mDescription = value;
        self.mDescription = value;
    }
}
- (id)valueForUndefinedKey:(NSString *)key {
    return nil;// 返回空
}
// MRC 下的setter 方法
// assign 修饰的属性的setter方法
- (void)setNumber:(NSInteger)number {
    _number = number;
}
// retain 修饰的属性的setter方法
- (void)setName:(NSString *)name {
    if (_name != name) {
        [_name release];
        _name = [name retain];
    }
}
// copy 修饰的属性的setter方法
- (void)setMDescription:(NSString *)mDescription {
    if (_mDescription != mDescription) {
        [_mDescription release];
        _mDescription = [mDescription copy]; // 是 copy 不是 retain 修饰
    }
}

@end
